Conversation
Co-authored-by: xsahil03x <25670178+xsahil03x@users.noreply.github.com>
Co-authored-by: xsahil03x <25670178+xsahil03x@users.noreply.github.com>
Co-authored-by: xsahil03x <25670178+xsahil03x@users.noreply.github.com>
# Conflicts: # packages/stream_chat_flutter/CHANGELOG.md
Co-authored-by: xsahil03x <25670178+xsahil03x@users.noreply.github.com>
# Conflicts: # packages/stream_chat_flutter/CHANGELOG.md
# Conflicts: # packages/stream_chat_flutter/CHANGELOG.md # packages/stream_chat_flutter_core/CHANGELOG.md
# Conflicts: # melos.yaml # packages/stream_chat/CHANGELOG.md # packages/stream_chat/example/pubspec.yaml # packages/stream_chat/lib/version.dart # packages/stream_chat/pubspec.yaml # packages/stream_chat_flutter/example/pubspec.yaml # packages/stream_chat_flutter/pubspec.yaml # packages/stream_chat_flutter_core/example/pubspec.yaml # packages/stream_chat_flutter_core/pubspec.yaml # packages/stream_chat_localizations/CHANGELOG.md # packages/stream_chat_localizations/example/pubspec.yaml # packages/stream_chat_localizations/pubspec.yaml # packages/stream_chat_persistence/CHANGELOG.md # packages/stream_chat_persistence/example/pubspec.yaml # packages/stream_chat_persistence/pubspec.yaml # sample_app/pubspec.yaml
# Conflicts: # packages/stream_chat/CHANGELOG.md # packages/stream_chat_flutter_core/CHANGELOG.md
# Conflicts: # melos.yaml # packages/stream_chat/CHANGELOG.md # packages/stream_chat/example/pubspec.yaml # packages/stream_chat/lib/version.dart # packages/stream_chat/pubspec.yaml # packages/stream_chat_flutter/CHANGELOG.md # packages/stream_chat_flutter/example/pubspec.yaml # packages/stream_chat_flutter/pubspec.yaml # packages/stream_chat_flutter_core/example/pubspec.yaml # packages/stream_chat_flutter_core/pubspec.yaml # packages/stream_chat_localizations/CHANGELOG.md # packages/stream_chat_localizations/example/pubspec.yaml # packages/stream_chat_localizations/pubspec.yaml # packages/stream_chat_persistence/CHANGELOG.md # packages/stream_chat_persistence/example/pubspec.yaml # packages/stream_chat_persistence/pubspec.yaml # sample_app/pubspec.yaml
Co-authored-by: xsahil03x <25670178+xsahil03x@users.noreply.github.com>
# Conflicts: # packages/stream_chat/CHANGELOG.md # packages/stream_chat_flutter_core/CHANGELOG.md
# Conflicts: # packages/stream_chat_flutter/CHANGELOG.md # packages/stream_chat_flutter/lib/src/message_input/stream_message_input.dart # packages/stream_chat_persistence/CHANGELOG.md
The animation curves and durations for the reaction picker and message modal have been updated for a smoother user experience. - The `reaction_picker_icon_list.dart` animation curve is now `Curves.easeOutBack` and the duration is 335 milliseconds. - The `message_modal.dart` transition duration is now 335 milliseconds, and the scale animation curve is `Curves.easeOutBack`.
# Conflicts: # packages/stream_chat_persistence/CHANGELOG.md # packages/stream_chat_persistence/lib/src/db/drift_chat_database.dart
# Conflicts: # .github/workflows/stream_flutter_workflow.yml # melos.yaml # packages/stream_chat/CHANGELOG.md # packages/stream_chat/example/pubspec.yaml # packages/stream_chat/lib/src/client/channel.dart # packages/stream_chat/lib/src/client/client.dart # packages/stream_chat/lib/src/core/util/list_extensions.dart # packages/stream_chat/lib/version.dart # packages/stream_chat/pubspec.yaml # packages/stream_chat/test/src/client/channel_test.dart # packages/stream_chat/test/src/client/client_test.dart # packages/stream_chat/test/src/core/util/in_flight_cache_test.dart # packages/stream_chat/test/src/core/util/list_extensions_test.dart # packages/stream_chat_flutter/CHANGELOG.md # packages/stream_chat_flutter/example/pubspec.yaml # packages/stream_chat_flutter/lib/scrollable_positioned_list/src/positioned_list.dart # packages/stream_chat_flutter/lib/scrollable_positioned_list/src/scrollable_positioned_list.dart # packages/stream_chat_flutter/lib/scrollable_positioned_list/src/viewport.dart # packages/stream_chat_flutter/lib/src/message_input/stream_message_input.dart # packages/stream_chat_flutter/lib/src/message_input/stream_message_input_attachment_list.dart # packages/stream_chat_flutter/lib/src/message_list_view/message_list_view.dart # packages/stream_chat_flutter/lib/src/misc/separated_reorderable_list_view.dart # packages/stream_chat_flutter/lib/src/poll/creator/poll_switch_list_tile.dart # packages/stream_chat_flutter/pubspec.yaml # packages/stream_chat_flutter/test/scrollable_positioned_list/horizontal_scrollable_positioned_list_test.dart # packages/stream_chat_flutter/test/scrollable_positioned_list/item_key_builder_test.dart # packages/stream_chat_flutter/test/scrollable_positioned_list/reversed_scrollable_positioned_list_test.dart # packages/stream_chat_flutter/test/scrollable_positioned_list/scrollable_positioned_list_test.dart # packages/stream_chat_flutter/test/scrollable_positioned_list/separated_scrollable_positioned_list_test.dart # packages/stream_chat_flutter/test/scrollable_positioned_list/seperated_horizontal_scrollable_positioned_list_test.dart # packages/stream_chat_flutter/test/scrollable_positioned_list/shrink_wrap_scrollable_position_list_test.dart # packages/stream_chat_flutter/test/src/attachment/goldens/ci/stream_voice_recording_attachment_idle_dark.png # packages/stream_chat_flutter/test/src/attachment/goldens/ci/stream_voice_recording_attachment_idle_light.png # packages/stream_chat_flutter/test/src/attachment/goldens/ci/stream_voice_recording_attachment_playing_dark.png # packages/stream_chat_flutter/test/src/attachment/goldens/ci/stream_voice_recording_attachment_playing_light.png # packages/stream_chat_flutter/test/src/attachment/goldens/ci/stream_voice_recording_attachment_playlist_dark.png # packages/stream_chat_flutter/test/src/attachment/goldens/ci/stream_voice_recording_attachment_playlist_light.png # packages/stream_chat_flutter/test/src/avatars/goldens/ci/gradient_avatar_issue_2369.png # packages/stream_chat_flutter/test/src/avatars/goldens/ci/group_avatar_0.png # packages/stream_chat_flutter/test/src/avatars/goldens/ci/user_avatar_0.png # packages/stream_chat_flutter/test/src/avatars/goldens/ci/user_avatar_1.png # packages/stream_chat_flutter/test/src/bottom_sheets/goldens/ci/attachment_modal_sheet_0.png # packages/stream_chat_flutter/test/src/bottom_sheets/goldens/ci/edit_message_sheet_0.png # packages/stream_chat_flutter/test/src/bottom_sheets/goldens/ci/error_alert_sheet_0.png # packages/stream_chat_flutter/test/src/channel/goldens/ci/channel_header_bottom_widget.png # packages/stream_chat_flutter/test/src/dialogs/goldens/ci/confirmation_dialog_0.png # packages/stream_chat_flutter/test/src/dialogs/goldens/ci/delete_message_dialog_0.png # packages/stream_chat_flutter/test/src/dialogs/goldens/ci/message_dialog_0.png # packages/stream_chat_flutter/test/src/dialogs/goldens/ci/message_dialog_1.png # packages/stream_chat_flutter/test/src/dialogs/goldens/ci/message_dialog_2.png # packages/stream_chat_flutter/test/src/gallery/goldens/ci/gallery_footer_0.png # packages/stream_chat_flutter/test/src/gallery/goldens/ci/gallery_header_0.png # packages/stream_chat_flutter/test/src/icons/goldens/ci/stream_svg_icon_light.png # packages/stream_chat_flutter/test/src/indicators/goldens/ci/sending_indicator_0.png # packages/stream_chat_flutter/test/src/indicators/goldens/ci/sending_indicator_1.png # packages/stream_chat_flutter/test/src/indicators/goldens/ci/sending_indicator_2.png # packages/stream_chat_flutter/test/src/indicators/goldens/ci/sending_indicator_3.png # packages/stream_chat_flutter/test/src/message_input/audio_recorder/goldens/ci/stream_audio_recorder_button_idle_dark.png # packages/stream_chat_flutter/test/src/message_input/audio_recorder/goldens/ci/stream_audio_recorder_button_idle_light.png # packages/stream_chat_flutter/test/src/message_input/audio_recorder/goldens/ci/stream_audio_recorder_button_recording_hold_dark.png # packages/stream_chat_flutter/test/src/message_input/audio_recorder/goldens/ci/stream_audio_recorder_button_recording_hold_light.png # packages/stream_chat_flutter/test/src/message_input/audio_recorder/goldens/ci/stream_audio_recorder_button_recording_locked_dark.png # packages/stream_chat_flutter/test/src/message_input/audio_recorder/goldens/ci/stream_audio_recorder_button_recording_locked_light.png # packages/stream_chat_flutter/test/src/message_input/audio_recorder/goldens/ci/stream_audio_recorder_button_recording_stopped_dark.png # packages/stream_chat_flutter/test/src/message_input/audio_recorder/goldens/ci/stream_audio_recorder_button_recording_stopped_light.png # packages/stream_chat_flutter/test/src/message_input/goldens/ci/attachment_button_0.png # packages/stream_chat_flutter/test/src/message_input/goldens/ci/clear_input_item_0.png # packages/stream_chat_flutter/test/src/message_input/goldens/ci/command_button_0.png # packages/stream_chat_flutter/test/src/message_input/goldens/ci/countdown_button_0.png # packages/stream_chat_flutter/test/src/message_list_view/auto_scroll_test.dart # packages/stream_chat_flutter/test/src/message_list_view/mark_read_test.dart # packages/stream_chat_flutter/test/src/message_widget/goldens/ci/deleted_message_custom.png # packages/stream_chat_flutter/test/src/message_widget/goldens/ci/deleted_message_dark.png # packages/stream_chat_flutter/test/src/message_widget/goldens/ci/deleted_message_light.png # packages/stream_chat_flutter/test/src/message_widget/goldens/ci/message_text.png # packages/stream_chat_flutter/test/src/misc/goldens/ci/reaction_bubble_2.png # packages/stream_chat_flutter/test/src/misc/goldens/ci/reaction_bubble_3_dark.png # packages/stream_chat_flutter/test/src/misc/goldens/ci/reaction_bubble_3_light.png # packages/stream_chat_flutter/test/src/misc/goldens/ci/reaction_bubble_like_dark.png # packages/stream_chat_flutter/test/src/misc/goldens/ci/reaction_bubble_like_light.png # packages/stream_chat_flutter/test/src/misc/goldens/ci/stream_audio_waveform_slider_custom_dark.png # packages/stream_chat_flutter/test/src/misc/goldens/ci/stream_audio_waveform_slider_custom_light.png # packages/stream_chat_flutter/test/src/misc/goldens/ci/stream_audio_waveform_slider_dark.png # packages/stream_chat_flutter/test/src/misc/goldens/ci/stream_audio_waveform_slider_empty_dark.png # packages/stream_chat_flutter/test/src/misc/goldens/ci/stream_audio_waveform_slider_empty_light.png # packages/stream_chat_flutter/test/src/misc/goldens/ci/stream_audio_waveform_slider_inverted_dark.png # packages/stream_chat_flutter/test/src/misc/goldens/ci/stream_audio_waveform_slider_inverted_light.png # packages/stream_chat_flutter/test/src/misc/goldens/ci/stream_audio_waveform_slider_less_data_dark.png # packages/stream_chat_flutter/test/src/misc/goldens/ci/stream_audio_waveform_slider_less_data_light.png # packages/stream_chat_flutter/test/src/misc/goldens/ci/stream_audio_waveform_slider_light.png # packages/stream_chat_flutter/test/src/misc/goldens/ci/stream_audio_waveform_slider_progress_dark.png # packages/stream_chat_flutter/test/src/misc/goldens/ci/stream_audio_waveform_slider_progress_light.png # packages/stream_chat_flutter/test/src/misc/goldens/ci/stream_timestamp_dark.png # packages/stream_chat_flutter/test/src/misc/goldens/ci/stream_timestamp_light.png # packages/stream_chat_flutter/test/src/misc/goldens/ci/system_message_dark.png # packages/stream_chat_flutter/test/src/misc/goldens/ci/system_message_light.png # packages/stream_chat_flutter/test/src/poll/creator/goldens/ci/poll_delete_option_dialog_dark.png # packages/stream_chat_flutter/test/src/poll/creator/goldens/ci/poll_delete_option_dialog_light.png # packages/stream_chat_flutter/test/src/poll/creator/goldens/ci/poll_option_reorderable_list_view_dark.png # packages/stream_chat_flutter/test/src/poll/creator/goldens/ci/poll_option_reorderable_list_view_error_dark.png # packages/stream_chat_flutter/test/src/poll/creator/goldens/ci/poll_option_reorderable_list_view_error_light.png # packages/stream_chat_flutter/test/src/poll/creator/goldens/ci/poll_option_reorderable_list_view_light.png # packages/stream_chat_flutter/test/src/poll/creator/goldens/ci/poll_question_text_field_dark.png # packages/stream_chat_flutter/test/src/poll/creator/goldens/ci/poll_question_text_field_error_dark.png # packages/stream_chat_flutter/test/src/poll/creator/goldens/ci/poll_question_text_field_error_light.png # packages/stream_chat_flutter/test/src/poll/creator/goldens/ci/poll_question_text_field_light.png # packages/stream_chat_flutter/test/src/poll/creator/goldens/ci/stream_poll_creator_dialog_dark.png # packages/stream_chat_flutter/test/src/poll/creator/goldens/ci/stream_poll_creator_dialog_light.png # packages/stream_chat_flutter/test/src/poll/creator/goldens/ci/stream_poll_creator_full_screen_dialog_dark.png # packages/stream_chat_flutter/test/src/poll/creator/goldens/ci/stream_poll_creator_full_screen_dialog_light.png # packages/stream_chat_flutter/test/src/poll/goldens/ci/poll_option_reorderable_list_view_dark.png # packages/stream_chat_flutter/test/src/poll/goldens/ci/poll_option_reorderable_list_view_error.png # packages/stream_chat_flutter/test/src/poll/goldens/ci/poll_option_reorderable_list_view_light.png # packages/stream_chat_flutter/test/src/poll/goldens/ci/poll_question_text_field_dark.png # packages/stream_chat_flutter/test/src/poll/goldens/ci/poll_question_text_field_error.png # packages/stream_chat_flutter/test/src/poll/goldens/ci/poll_question_text_field_light.png # packages/stream_chat_flutter/test/src/poll/goldens/ci/stream_poll_creator_dialog_dark.png # packages/stream_chat_flutter/test/src/poll/goldens/ci/stream_poll_creator_dialog_light.png # packages/stream_chat_flutter/test/src/poll/goldens/ci/stream_poll_creator_full_screen_dialog_dark.png # packages/stream_chat_flutter/test/src/poll/goldens/ci/stream_poll_creator_full_screen_dialog_light.png # packages/stream_chat_flutter/test/src/poll/goldens/ci/stream_poll_options_dialog_dark.png # packages/stream_chat_flutter/test/src/poll/goldens/ci/stream_poll_options_dialog_light.png # packages/stream_chat_flutter/test/src/poll/goldens/ci/stream_poll_results_dialog_dark.png # packages/stream_chat_flutter/test/src/poll/goldens/ci/stream_poll_results_dialog_light.png # packages/stream_chat_flutter/test/src/poll/goldens/ci/stream_poll_results_dialog_with_show_all_dark.png # packages/stream_chat_flutter/test/src/poll/goldens/ci/stream_poll_results_dialog_with_show_all_light.png # packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_add_comment_dialog_dark.png # packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_add_comment_dialog_light.png # packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_add_comment_dialog_with_initial_value_dark.png # packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_add_comment_dialog_with_initial_value_light.png # packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_end_vote_dialog_dark.png # packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_end_vote_dialog_light.png # packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_header_dark.png # packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_header_light.png # packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_header_long_question_dark.png # packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_header_long_question_light.png # packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_header_subtitle_voting_mode_all_dark.png # packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_header_subtitle_voting_mode_all_light.png # packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_header_subtitle_voting_mode_disabled_dark.png # packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_header_subtitle_voting_mode_disabled_light.png # packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_header_subtitle_voting_mode_limited_dark.png # packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_header_subtitle_voting_mode_limited_light.png # packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_header_subtitle_voting_mode_unique_dark.png # packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_header_subtitle_voting_mode_unique_light.png # packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_suggest_option_dialog_dark.png # packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_suggest_option_dialog_light.png # packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_suggest_option_dialog_with_initial_option_dark.png # packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/poll_suggest_option_dialog_with_initial_option_light.png # packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/stream_poll_interactor_closed_dark.png # packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/stream_poll_interactor_closed_light.png # packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/stream_poll_interactor_dark.png # packages/stream_chat_flutter/test/src/poll/interactor/goldens/ci/stream_poll_interactor_light.png # packages/stream_chat_flutter/test/src/scroll_view/draft_scroll_view/goldens/ci/stream_draft_list_tile_dark.png # packages/stream_chat_flutter/test/src/scroll_view/draft_scroll_view/goldens/ci/stream_draft_list_tile_light.png # packages/stream_chat_flutter/test/src/scroll_view/thread_scroll_view/goldens/ci/stream_thread_list_tile_dark.png # packages/stream_chat_flutter/test/src/scroll_view/thread_scroll_view/goldens/ci/stream_thread_list_tile_light.png # packages/stream_chat_flutter/test/src/scroll_view/thread_scroll_view/goldens/ci/stream_unread_threads_banner_dark.png # packages/stream_chat_flutter/test/src/scroll_view/thread_scroll_view/goldens/ci/stream_unread_threads_banner_light.png # packages/stream_chat_flutter_core/CHANGELOG.md # packages/stream_chat_flutter_core/example/pubspec.yaml # packages/stream_chat_flutter_core/lib/src/better_stream_builder.dart # packages/stream_chat_flutter_core/lib/src/message_list_core.dart # packages/stream_chat_flutter_core/lib/src/paged_value_scroll_view.dart # packages/stream_chat_flutter_core/pubspec.yaml # packages/stream_chat_flutter_core/test/message_list_core_test.dart # packages/stream_chat_flutter_core/test/stream_channel_test.dart # packages/stream_chat_flutter_core/test/stream_chat_core_test.dart # packages/stream_chat_localizations/CHANGELOG.md # packages/stream_chat_localizations/example/pubspec.yaml # packages/stream_chat_localizations/pubspec.yaml # packages/stream_chat_persistence/CHANGELOG.md # packages/stream_chat_persistence/example/pubspec.yaml # packages/stream_chat_persistence/lib/src/db/shared/native_db.dart # packages/stream_chat_persistence/lib/src/stream_chat_persistence_client.dart # packages/stream_chat_persistence/pubspec.yaml # packages/stream_chat_persistence/test/stream_chat_persistence_client_test.dart # sample_app/ios/Runner/Info.plist # sample_app/ios/fastlane/Fastfile # sample_app/lib/app.dart # sample_app/lib/firebase_options.dart # sample_app/pubspec.yaml
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
* update migration docs with latest changes * Add migration doc for sort option * docs: correct migration docs against verified source Apply ~70+ corrections across all 16 redesign migration docs and v10-migration.md based on a source-by-source verification pass. Fixes non-existent symbols, wrong constructor params, wrong typedef signatures, and stale class names that would prevent migration code examples from compiling. Adds the missing ClientState collection immutability breaking-change section (introduced in 2501f53). Also cleans up five stale dartdoc references in source that seeded some of the wrong names in the docs (StreamMessagePlacement → StreamMessageLayout, UrlAttachmentBuilder → LinkPreviewAttachmentBuilder, StreamChat(config:) → streamChatConfigData:, etc.). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * refactor(ui)!: remove unused MessageDetails class The MessageDetails class was only used by itself — no live consumers in packages/ or sample_app. The new messageBuilder signature stopped passing it as an argument, leaving the class as dead public surface area. Delete the file and its export; update CHANGELOG and the migration doc that previously said "no longer passed to builders" to reflect the actual removal. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * feat(ui): re-export StreamAvatarTheme/Data from stream_core_flutter The two avatar theme types live in stream_core_flutter, but consumers who only depended on stream_chat_flutter had to add a second import to theme avatars globally. Add them to the show allowlist so existing StreamAvatarThemeData imports keep working, drop the now-redundant stream_core_flutter import from stream_media_gallery_item.dart, and update the migration doc that previously instructed users to import from stream_core_flutter directly. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * chore(ui): inline AttachmentPickerOptionsBuilder typedef, drop empty file stream_attachment_picker_bottom_sheet.dart only held the AttachmentPickerOptionsBuilder typedef — the filename implied a sheet class that no longer exists after pickers became inline. Move the typedef into stream_attachment_picker.dart (next to the picker widgets and builder functions that use it) and delete the misleading file. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs: add Stream Core / Stream Chat preamble to redesign README Front-load the two-layer split so future doc passes don't conflate "moved to stream_core_flutter" with "removed." Includes a small core-primitive ↔ chat-wrapper table and a "frequently confused names" list covering the wrong-name patterns that surfaced during the verification pass (StreamMessagePlacement → StreamMessageLayout, kStreamHeaderHeight → kStreamToolbarHeight, etc.). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs: address CodeRabbit review comments - attachments_and_polls.md: fix stale #streamattachmentpickeroption anchor (→ #attachment-picker) and drop reference to the removed showStreamAttachmentPickerModalBottomSheet function. - v10-migration.md: stable-release boundary was beta.12, not beta.13 (matches the upgrade matrix at the top of the doc). - message_actions.md: drop StreamMessageReactionsModal from the showStreamDialog Future<T?> "returns" list — the class is deleted. - message_composer.md: destructure cooldownTimeOut from SlowModePlaceholder so translations.slowModeOnLabel(int) gets its required argument; matches the source dartdoc example verbatim. The fourth flagged comment (onDismissTap row in unread_indicator_button.md) was already removed in the earlier verification pass. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs(ui): use American spelling "customization" in reaction_picker.md Line 31 used British "customisation" while the rest of the doc (and the heading at line 299) uses American "Customization". Match the rest. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fixed last StreamMessagePlacement occurrence --------- Co-authored-by: Sahil Kumar <xdsahil@gmail.com> Co-authored-by: Sahil Kumar <sahil@getstream.io> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Enable drafts and voice recording by default * update drafts default in sample app * Disable enforceUniqueReactions by default * Update changelog * Add draft mocks
* apply filter of supported emoji * Update changelog * Add doc screenshots * chore: Update Docs Snapshots * test(docs): settle before precaching so deferred avatars decode docsGoldenTest's default pumpBeforeTest now calls pumpAndSettle before precacheImages, so modal sheets and paginated list views finish rendering before the image scan runs — fixing the empty avatar circles in the reaction detail sheet and reaction list view goldens. Reaction stubs move into the test builders now that custom pumpBeforeTest overrides are no longer needed. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * chore: remove unused import * chore: Update Docs Snapshots --------- Co-authored-by: renefloor <15101411+renefloor@users.noreply.github.com> Co-authored-by: Sahil Kumar <sahil@getstream.io> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: xsahil03x <25670178+xsahil03x@users.noreply.github.com>
…#2699) * fix(ui): preserve composer state when draft stream emits initial null `_onDraftUpdate` previously called `_effectiveController.reset()` on any null emission, including the initial subscription event when no draft existed on the server. That wiped pre-populated composer state (text, quoted message, attachments) immediately after the composer mounted. Track the last draft seen on the stream and reset only on a real non-null → null transition; the initial-no-draft case is now a no-op. Also: stub createDraft/deleteDraft in the docs_screenshots mocks (composer saves drafts on deactivate), register a DraftMessage mocktail fallback, seed text/controllers in default-state composer snapshots so they showcase the send button, and dispose externally-created controllers via addTearDown. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * test(ui): cover draft stream behavior in composer Add unit tests pinning the _onDraftUpdate semantics: - initial null on subscription preserves pre-populated text, quoted message, and attachments; - non-null draft loads its content into the controller; - non-null → null transition resets the controller (real removal). Also move the _lastDraft field next to _onDraftUpdate so the tracking state is colocated with the logic that uses it. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * chore(ci): add 'both' option to update_goldens workflow Lets a single dispatch run both the SDK and docs golden updates in one go, instead of having to fire the workflow twice with different targets. Naming matches the existing 'both' option in the distribute workflows. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * chore: dart format draft composer test Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * test(docs): dispose seeded controller in custom send icon golden Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * chore: Update Docs Snapshots --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: xsahil03x <25670178+xsahil03x@users.noreply.github.com>
Resolves SPL conflicts in scrollable_positioned_list and positioned_list: - Take master's preserve-pixels `_updateFirstVisibleItemIfNeeded` (PR #2703) - Take master's empty-list `_centerSliverPadding` guard - Take master's RTL `_axisDirection`-based `_updatePositions` branching - Take master's `_resolveLeadingEndPaddingAdjust` `index != 0` check - Drop orphaned `message_card_test.dart` (widget deleted in v10 design refresh); master's MessageCard fix from #2702 ported to StreamMessageContent. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
# Conflicts: # .github/workflows/distribute_internal.yml # sample_app/ios/fastlane/Fastfile # sample_app/pubspec.yaml # tools/generate_version.dart
…verlay wraps Sequel to #2704, which landed `StreamChannel.value` and the `MessageListCore` dispose-time guard on master but only converted re-wrap sites that exist on master. The remaining v10-only call sites were still using the default `StreamChannel(...)` constructor, so they continued running channel-page positioning on mount and clobbering the parent route's loaded window. - Switched the SDK's thread page wrap, long-press message-actions modal, media gallery preview, and four poll sheets to `StreamChannel.value`. - Switched the sample app's info screens, member/edit/detail sheets, location detail dialog, deep-link routes, and the channel-media gallery push to `StreamChannel.value`. - Moved the `_isThreadConversation` guard in `MessageListCore` to the dispose call site so the intent — "thread mode skips the reload" — reads at the point we'd otherwise trigger it. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Edit message action in thread view was a silent no-op because ThreadPage never forwarded an onEditMessageTap callback to its StreamMessageListView. Mirror the channel page wiring so editing a thread reply drops the thread's composer into edit mode. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sequel to #2704, which landed the `ScrollablePositionedList` first-frame guard on master. The thread-side wiring that takes advantage of it was v10-only and is added here. - `StreamMessageListView.initialIndex` returns the caller-supplied `initialScrollIndex` (or `0`) in thread mode instead of running `getInitialIndex` against the channel's loaded window — channel-derived indices don't map to thread items and could place the SPL out of bounds. - The outer `BetterStreamBuilder<Message>` wrapping the thread page now uses `mapNotNull` + `firstWhereOrNull`, so it no longer throws `Bad state: No element` on every channel-state emission when the parent isn't in the channel's loaded window (the steady state after the pure-fetch `getMessagesById` fix from #2704). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Remove reactionOverlap from config * chore: Update Goldens * update migration docs * remove any mention of reactionOverlap --------- Co-authored-by: renefloor <15101411+renefloor@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
# Conflicts: # packages/stream_chat_flutter/CHANGELOG.md
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…attachment validation (#2706) * Add appSettings API for upload config * rename sizeLimit * Added validation also for dropping attachments * fix doc for maxAttachmentSize * cover localizations * fix(ui): remove padding from StreamPhotoGallery * Wrap `StreamPhotoGallery` with `MediaQuery.removePadding` to fix a bottom padding issue in the gallery picker. * refactor(llc, ui): restructure appSettings into AppSettingsManager and StreamAttachmentValidator LLC: - Move appSettings caching into a dedicated AppSettingsManager owned by the client; expose `client.appSettings` (cached) and `client.getAppSettings()` (refresh). Auto-loads on connect, clears on disconnect. - Drop the `UploadConfig.isAllowed` helper — validation logic lives in the UI package where it has access to translations and the composer error sheet. - Add `UploadConfig.defaultSizeLimit` (100 MB, matching backend default). - Make `AppSettings` and `UploadConfig` equatable. UI: - Add `StreamAttachmentValidator` — a stateless rule set built from `AppSettings`. Exposes `validateCount(int)` and `validate(Attachment)` that return typed errors instead of throwing. - Add typed errors `AttachmentLimitReachedError`, `AttachmentTooLargeError`, and `AttachmentBlockedError`. - `StreamAttachmentPickerController` now takes a single `validator` param. - `StreamMessageComposer` validates picked/pasted/dropped attachments via the validator (built from `client.appSettings`) and surfaces the first failure through the localized error sheet. - Remove `StreamMessageComposer.maxAttachmentSize`, `onAttachmentLimitExceed`, the `AttachmentLimitExceedListener` typedef, and `kDefaultMaxAttachmentSize`. - `attachmentLimit` becomes non-nullable, defaulting to `StreamAttachmentValidator.defaultMaxAttachmentCount` (30 — the backend cap). Tests: - 9 new tests for `AppSettingsManager` (cache, refresh, clear, error swallow). - 28 tests for `StreamAttachmentValidator` covering both lists across both dimensions, size fallback, image/file routing, compound extensions, and count validation. Docs: - Update CHANGELOGs for both packages to reflect the shipped surface. - Rewrite the `attachmentLimit` section in `migrations/redesign/message_composer.md` and add an "AppSettings-driven attachment validation" section. - Add `AttachmentBlockedError` to the typed-errors section in `migrations/v10-migration.md`. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs: point custom-error-UI guidance to StreamMessageComposer.onError `onError` on the composer short-circuits the default error sheet and receives the typed validator errors directly, so it's the right hook for custom UI. The previous wording reached past the composer into `StreamAttachmentPickerController.addAttachment`, which leaked internal wiring. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs: document new fileTypeNotSupportedError translation key Add the new abstract member to: - migrations/redesign/localizations.md (New Required Abstract Members + checklist count) - stream_chat_localizations CHANGELOG (Added) - stream_chat_flutter CHANGELOG (cross-references the localizations migration) The key is mandatory for any custom Translations subclass and was missing from the migration docs. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * refactor(localizations): use early-return in fileTypeNotSupportedError Replace the inline ternary with an explicit early-return for the extension-known branch across all locale implementations, the DefaultTranslations base, the example custom-locale, and the migration guide. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * i18n: translate fileTypeNotSupportedError across all locales Replace the English fallback with actual translations in ca, de, es, fr, hi, it, ja, ko, no, and pt — matching the tone of the adjacent fileTooLargeError in each locale. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs: attribute upload config to Stream Dashboard, not the backend The size/extension/MIME lists in AppSettings are configured by customers in the Stream Dashboard and served via GET /app — they're not defined by the backend. References to "backend-configured" / "the backend value" / "by the backend" mis-attributed the source; updated to "app-configured" or "configured in the Stream Dashboard". Kept "backend" where it's still correct: - The hard-coded MaxNumberOfMessageAttachments = 30 cap (a backend constant). - Server-side enforcement (the server does reject mis-typed messages). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs: drop "construct your own picker controller" suggestion The picker controller is constructed inside StreamMessageComposer, not by SDK users, so suggesting they instantiate one to inject a custom validator was misleading. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs: tighten changelog entries to public surface only Drop impl details from the AppSettings changelog entries — users care about the public API (StreamChatClient.appSettings, the typed errors via onError, the new translation key, the removed/changed composer params) not about how the SDK loads, caches, or wires things together under the hood. Removed entries for StreamAttachmentValidator (plumbing — users never construct it) and the standalone "Added typed validator errors" line (the errors are mentioned where they matter, inside the composer behavior entry). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs: drop duplicate migration-doc links from changelog entries Multiple breaking entries linked to the same message_composer.md section; the localizations entry duplicated the catch-all link already present further down. Readers find the migration docs through the normal route. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs: trim verbose changelog entries to match neighbour density - Tighten the composer-validates entry from two long sentences to two short ones (drops "every picked, pasted, and dropped attachment" and the "render your own UI" tail). - Drop the trailing "Required override on any custom Translations subclass" — line 58 catch-all already states this. - Restore the "(replaces the previous size / limit / config parameters)" context on the picker controller breaking entry — it's migration info, not impl detail, and matches the rename-style neighbours. - Tighten the localizations changelog entry to two lines, matching the threadLabel / commandUsernameLabel format. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs(localizations): drop UI context from changelog entry The stream_chat_localizations package doesn't know which UI surface consumes a translation; localizations CHANGELOG entries should describe the translation itself, not the consumer. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Sahil Kumar <sahil@getstream.io> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: Sahil Kumar <xdsahil@gmail.com>
4 tasks
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* deprecate typedef * deprecate icons --------- Co-authored-by: Sahil Kumar <xdsahil@gmail.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
v10.0.0 — Design Refresh & API Modernization
This is the v10.0.0 major release for Stream Chat Flutter. It introduces a refreshed UI, redesigned customization APIs, new chat features (location sharing, delete-for-me, slow mode UI), and aligns naming with the Android and iOS SDKs.
📖 Full migration guide — start here if you're upgrading from v9.x or any v10 beta.
Headline changes
🎨 SDK redesign (#2503)
A full visual refresh across the entire UI package, synced with the Figma design system. New default theme, updated channel/message/composer/poll/media surfaces, simplified icon set (#2619).
💬 New chat features
endAt(feat(llc): Store endAt in UTC #2428)MessageDeleteScopeAPI (feat(llc, ui): add delete message for me #2394), persistence fields (feat(persistence): add deletedForMe and deletedMessages fields #2395), event handling (feat(llc, persistence): handle user.messages.deleted event #2423)AttachmentFileUploader(feat(llc)!: add standalone file/image upload/remove methods #2396)emoji_codesupport across LLC, persistence, and UI (feat(llc, ui, persistence)!: add support for reaction emoji_code #2326)reactionIndicatorBuilder(feat(ui): add reactionIndicatorBuilder for custom reaction indicators #2440)attachmentPickerOptionsBuilder#2415)onAttachmentTapfallback — call default behavior from custom handlers (feat(ui)!: enhance onAttachmentTap with fallback to default behavior #2426)StreamChatConfiguration.maybeOf()— non-throwing variant🧱 Breaking API redesigns
sendReactionnow takes aReactionobject; reaction picker rewritten withonReactionPickedcallbacks (refactor!(ui): add support for customising reaction picker #2248, refactor(ui)!: improve reaction bubble implementation #2277)showStreamDialogreplacesshowStreamMessageModal(refactor(ui)!: re-wrote message actions and modals #2156, refactor(ui): introduce showStreamDialog and replace showStreamMessageModal #2344)MessageItem,MessageAction, etc. (refactor(ui, sample)!: align message item naming with android and ios sdks #2643)inputController→composerController(feat(UI): rename message input #2642, fix(ui, core): rename input controller to composer controller #2646)AttachmentPickerControllererrors — typedAttachmentTooLargeError/AttachmentLimitReachedErrorinstead ofArgumentError(refactor(ui)!: replace ArgumentError with typed errors #2479)ClientStatecollections — immutable returns, prevent external mutation (fix(llc)!: prevent external mutation of ClientState collections #2686)file_picker11 (chore(deps)!: bump dep floors, widen plus-plugin majors, migrate file_picker 11 #2644)🛠 Other notable changes
child,enabled,onRefresh) (feat(ui): thread list banner redesign #2608)SampleAppConfig(feat(samples): implementSampleAppConfigand modernize UI architechture #2614)🐞 Notable fixes
emoji_coderegression fix (fix(ui): fix regression in emoji_code support for reactions #2474)sendReplycapability (fix(ui): enable sending reply in threads for users with sendReply capability #2385)fileSizeonly required when a file is present (fix(llc): require attachment fileSize only when there is a file #2673)Scope
master(12 beta releases:10.0.0-beta.1through10.0.0-beta.13)mastermerged in via chore(repo): merge master into v10.0.0 #2682 and the merge commit at the tip of this branchTest plan
melos run test:allpasses (Dart + Flutter, CI goldens)melos run lint:allpasses (analyze + format)melos run generate:allproduces no diffv10.0.0-beta.13→10.0.0🤖 Generated with Claude Code